初めてのAPI Gateway
はじめに
菅野です。 今回はAPI GatewayとLambdaの連携に初挑戦です。 今まで一度も試してなかったのですが、同じような方は是非このエントリーの内容をお試しください。 「今さら聞けないAPI Gateway」スタートです。
API Gatewayを作成する
「APIの作成」ボタンをクリックしてAPI Gatewayを作成を開始します。
名前に「ExecLambda」と入力して「APIの作成」ボタンをクリックだけで完成。簡単ですね。
Lambda関数用のRoleを作成する
以下の条件で作成します。
- ロール名:「ExecLambda」
- ロールタイプの選択:「AWS Lambda」
- カスタムポリシー:以下の内容
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "logs:*" ], "Effect": "Allow", "Resource": "arn:aws:logs:*:*:*" } ] }
Lambda関数を作成する
以下の条件でLambda関数を作成します。 今回は簡単な関数しか書かないので、ついでにPythonも初挑戦します。
- Name:「LambdaTest」
- Runtime:「Python 2.7」
- Role:「ExecLambda」
- Lambda function code:以下の内容。クエリ文字列パラメーターとして「?myname=***」で渡すと「yourname」として返される仕様にします。
def lambda_handler(event, context): return { "yourname": event['myname'] }
API GatewayとLambdaを連携させる
設定はLambda側から行います。 「API endpoints」タブの中の「Add API endpoint」をクリックすると以下のようなポップアップが表示されます。 API Gatewayを選択すると、次は以下のようなポップアップが表示されます。
- 「API Name」には先ほど作成した「API Gateway」の名前を選択します。
- 「Resource name」は、URLのドメイン以降を指定します。今回はデフォルトで「/LambdaTest」が入力されているのでそれを使います。
- 「Method」はブラウザで簡単にテストできるように「GET」のままにします。
- 「Security」は「Open」にしておきます。
これらを入力したら「submit」ボタンをクリックしてください。 以下のように「API endpoint」の一覧に追加されているはずです。 (「API endpoint URL」に表示されたURLはメモしておいてください。後ほどブラウザからテストする時に使います)
このまま、API Gatewayのページへ移動してみましょう。 API名をクリックして中の設定を見ると、先ほど入力した「/LambdaTest」や「GET」が見えると思いますので「GET」をクリックしてください。 先ほど「API endpoints」で入力した内容でAPI Gatewayに設定された事がわかります。
GETのクエリ文字列パラメーターをAPI Gatewayに処理させる
今回ブラウザからアクセスする時に付加するクエリ文字列パラメーター「?myname=***」を、解析する為のコードは書かずにAPI Gatewayにおまかせすることにしましょう。 先ほどAPI Gatewayのページで「GET」をクリックした時に表示された中に、「統合リクエスト」というのがありますのでクリックしましょう。
表示された内容の中に「本文マッピングテンプレート」というものがあります。ここでクエリ文字列パラメーターをLambda関数のeventの要素の一つとしてマッピングする設定を行います。
- 「リクエスト本文のパススルー」は「テンプレートが定義されていない場合 (推奨)」を選択する
- 「マッピングテンプレートの追加」をクリックする
- 「Content-Type」に「application/json」と入力する
- 入力欄の右にあるチェックマークをクリックする
- テンプレートの内容は以下(クエリ文字列パラメーターのmynameをLambda関数のeventの要素にマッピングする)
{ "myname" : "$input.params('myname')" }
最後に「保存」ボタンをクリックして完了です。
実行してみる
ここまできたら後少しです。 まずは、API Gatewayのマッピングを変更したのでデプロイします。
- 左上にある「アクション」ボタンをクリックする
- 「API のデプロイ」をクリックする
- 「デプロイされるステージ」で「prod」を選択する
- 「デプロイ」をクリックする
それではブラウザに、先ほどLambdaでAPI endpointを追加した時にコピーしたURLを貼り付け、「?myname=masataka」を付加してアクセスしてみましょう。 {"yourname": "masataka"} と表示されれば完成です!
さいごに
いかがでしたでしょうか。 API Gatewayの作成は名前を決めるだけ、Lambdaとの連携はポチポチするだけ、クエリ文字列パラメータの分解はマッピングの設定をするだけと、お手軽にAPIができてしまいました。 しかもEC2インスタンスは不要、apacheの設定も不要、コストはAPIを叩いた時だけなのでお財布にもやさしいというおまけつきです。 使った事が無い方は、是非一度このお手軽さを体験してみてください。 (一度やってみればお手軽なのですが、私はAPIのデプロイがわからずに数時間試行錯誤してました・・・)
参考ページ
これらのページを参考にさせていただきました。 ありがとうございました。 Lambda 関数ハンドラー (Python) チュートリアル: Lambda 関数の API Gateway API を作成する AWS Lambda アクセス権限モデル 演習: HTTP エンドポイントの API Gateway API を作成する API Gateway のマッピングテンプレートリファレンス